using System;
using System.Linq;
using System.Runtime.Serialization;
using System.Data.Objects.DataClasses;
using System.Xml.Serialization;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;
using Acme.Northwind.EFDAL.Interfaces;

namespace Acme.Northwind.EFDAL.Interfaces.Entity
{
	/// <summary>
	/// This is the base interface for the EF entity for Product
	/// </summary>
	public partial interface IProduct : nHydrate.EFCore.DataAccess.IBusinessObject, nHydrate.EFCore.DataAccess.INHEntityObject, System.ComponentModel.IDataErrorInfo, System.IEquatable<Acme.Northwind.EFDAL.Interfaces.Entity.IProduct>, nHydrate.EFCore.DataAccess.IAuditable
	{
		#region Properties

		/// <summary>
		/// The property that maps back to the database 'Products.CategoryID' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("CategoryID")]
		int? CategoryID { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.Discontinued' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("Discontinued")]
		bool Discontinued { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.ProductID' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DataAnnotations.Key()]
		[System.ComponentModel.ReadOnly(true)]
		[System.ComponentModel.DisplayName("ProductID")]
		int ProductID { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.ProductName' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("ProductName")]
		string ProductName { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.QuantityPerUnit' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("QuantityPerUnit")]
		string QuantityPerUnit { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.ReorderLevel' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("ReorderLevel")]
		short? ReorderLevel { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.SupplierID' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("SupplierID")]
		int? SupplierID { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.UnitPrice' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("UnitPrice")]
		decimal? UnitPrice { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.UnitsInStock' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("UnitsInStock")]
		short? UnitsInStock { get; set; }

		/// <summary>
		/// The property that maps back to the database 'Products.UnitsOnOrder' field
		/// </summary>
		[System.ComponentModel.Browsable(true)]
		[System.ComponentModel.DisplayName("UnitsOnOrder")]
		short? UnitsOnOrder { get; set; }

		/// <summary>
		/// The audit field for the 'Created By' column.
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		string CreatedBy { get; }

		/// <summary>
		/// The audit field for the 'Created Date' column.
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		DateTime? CreatedDate { get; }

		/// <summary>
		/// The audit field for the 'Modified By' column.
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		string ModifiedBy { get; }

		/// <summary>
		/// The audit field for the 'Modified Date' column.
		/// </summary>
		[System.ComponentModel.Browsable(false)]
		DateTime? ModifiedDate { get; }

		#endregion

		#region Navigation Properties

		/// <summary>
		/// The back navigation definition for walking Product->OrderDetail
		/// </summary>
		[XmlIgnoreAttribute()]
		[SoapIgnoreAttribute()]
		[DataMemberAttribute()]
		[EdmRelationshipNavigationPropertyAttribute("Acme.Northwind.EFDAL.Interfaces.Entity", "FK_Order_details_products_OrderDetail_Product", "Order_details_productsOrderDetailList")]
		ICollection<Acme.Northwind.EFDAL.Interfaces.Entity.IOrderDetail> Order_details_productsOrderDetailList { get; }

		/// <summary>
		/// The navigation definition for walking Product->Category
		/// </summary>
		Acme.Northwind.EFDAL.Interfaces.Entity.ICategory Category { get; set; }

		/// <summary>
		/// The navigation definition for walking Product->Supplier
		/// </summary>
		Acme.Northwind.EFDAL.Interfaces.Entity.ISupplier Supplier { get; set; }

		#endregion

	}

}

#region Metadata Class

namespace Acme.Northwind.EFDAL.Interfaces.Entity.Metadata
{
	/// <summary>
	/// Metadata class for the 'Product' entity
	/// </summary>
	public partial class ProductMetadata : nHydrate.EFCore.DataAccess.IMetadata
	{
		#region Properties

		/// <summary>
		/// Metadata information for the 'CategoryID' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "CategoryID", AutoGenerateField = true)]
		public object CategoryID;

		/// <summary>
		/// Metadata information for the 'Discontinued' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "'Discontinued' is required.")]
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "Discontinued", AutoGenerateField = true)]
		public object Discontinued;

		/// <summary>
		/// Metadata information for the 'ProductID' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "'ProductID' is required.")]
		[System.ComponentModel.DataAnnotations.Key()]
		[System.ComponentModel.DataAnnotations.Editable(false)]
		[System.ComponentModel.ReadOnly(true)]
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "ProductID", AutoGenerateField = true)]
		public object ProductID;

		/// <summary>
		/// Metadata information for the 'ProductName' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.Required(ErrorMessage = "'ProductName' is required.")]
		[System.ComponentModel.DataAnnotations.StringLength(40, ErrorMessage = "The property 'ProductName' has a maximum length of 40")]
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "ProductName", AutoGenerateField = true)]
		public object ProductName;

		/// <summary>
		/// Metadata information for the 'QuantityPerUnit' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.StringLength(20, ErrorMessage = "The property 'QuantityPerUnit' has a maximum length of 20")]
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "QuantityPerUnit", AutoGenerateField = true)]
		public object QuantityPerUnit;

		/// <summary>
		/// Metadata information for the 'ReorderLevel' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "ReorderLevel", AutoGenerateField = true)]
		public object ReorderLevel;

		/// <summary>
		/// Metadata information for the 'SupplierID' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "SupplierID", AutoGenerateField = true)]
		public object SupplierID;

		/// <summary>
		/// Metadata information for the 'UnitPrice' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "UnitPrice", AutoGenerateField = true)]
		public object UnitPrice;

		/// <summary>
		/// Metadata information for the 'UnitsInStock' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "UnitsInStock", AutoGenerateField = true)]
		public object UnitsInStock;

		/// <summary>
		/// Metadata information for the 'UnitsOnOrder' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.DisplayAttribute(Description = "", Name = "UnitsOnOrder", AutoGenerateField = true)]
		public object UnitsOnOrder;

		/// <summary>
		/// Metadata information for the 'CreatedBy' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.StringLength(100, ErrorMessage = "The property 'CreatedBy' has a maximum length of 100")]
		[System.ComponentModel.ReadOnly(true)]
		public object CreatedBy;

		/// <summary>
		/// Metadata information for the 'CreatedDate' parameter
		/// </summary>
		[System.ComponentModel.ReadOnly(true)]
		public object CreatedDate;

		/// <summary>
		/// Metadata information for the 'ModifiedBy' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.StringLength(100, ErrorMessage = "The property 'ModifiedBy' has a maximum length of 100")]
		[System.ComponentModel.ReadOnly(true)]
		public object ModifiedBy;

		/// <summary>
		/// Metadata information for the 'ModifiedDate' parameter
		/// </summary>
		[System.ComponentModel.ReadOnly(true)]
		public object ModifiedDate;

		/// <summary>
		/// Metadata information for the 'Timestamp' parameter
		/// </summary>
		[System.ComponentModel.DataAnnotations.Timestamp()]
		[System.ComponentModel.ReadOnly(true)]
		public object Timestamp;

		#endregion

	}

}

#endregion

